package com.gzsxy.esjy.service.netty.common.transactional.annotations;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.transaction.TransactionDefinition;

/**
 * 分布式同步事物锁
 * @author zhangxiaolong
 * @date 2022/7/11 9:36
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface GosunTransactional {

	/**
	 * 默认加锁:锁住同一方法
	 * @return
	 */
	boolean lock() default true;
	
	/**
	 * 默认不锁锁:锁住全局，全局关键字
	 * @return
	 */
	boolean gloablLock() default false;

	/**
	 * spel表达式
	 * 
	 * key = "{#dto.alarmName}-{#dto.alarmCode}-{'English'}-{1}"
	 * 
	 * @return
	 */
	String key() default "";

	/**
	 * 最大等待时间(默认毫秒)
	 * 
	 * @return
	 */
	long maxWaitTime() default 2000;

	/**
	 * 时间间隔(默认毫秒)
	 * 
	 * @return
	 */
	long timeInterval() default 50;
	
	/**
	 * 事务
	 * 
	 * @return
	 */
	boolean transactional() default true;
	
	/**
	 * 数据库的事务隔离级别
	 *  **读取未提交（READ-UNCOMMITTED）：**最低的隔离级别，允许读取尚未提交的数据变更，可能造成脏读、不可重复读、幻读。
	 * 	 **读取已提交（READ-COMMITTED）：**允许读取并发事务已经提交的数据，可以避免脏读，但是可能造成不可重复、幻读。
	 * 	 **可重复读（REPEATABLE-READ）：**对同一字段多次读取的结果都是一致的，除非本身事务修改，可以避免脏读和不可重复读，但是可能造成幻读。
	 * 	 **可串行化（SERIALIZABLE）：**最高的隔离级别，完全服从ACID的隔离级别，所以的事务依次执行，可以避免脏读、不可重复读、幻读。
	 *
	 * 在 spring的 TransactionDefinition接口中一共定义了六种事务传播属性：
	 * 事务隔离级别
	 * PROPAGATION_REQUIRED -- 支持当前事务，如果当前没有事务，就新建一个事务。这是最常见的选择。
	 * @return
	 */
	int propagation() default TransactionDefinition.PROPAGATION_REQUIRED;
	
}
